أساسيات Active Record: التسمية، قراءة وكتابة البيانات، التوثيق، الاستدعاء، والتهجير
مقدمة
يُعد Active Record أحد أهم المكونات في إطار عمل Ruby on Rails، إذ يقدم واجهة برمجية قوية وفعالة للتعامل مع قواعد البيانات بطريقة كائنية (Object-Oriented). يمكّن هذا النمط المطورين من التعامل مع الصفوف في الجداول ككائنات حية لها خصائص وسلوكيات، مما يعزز من الإنتاجية ويقلل من الأخطاء المنهجية في التعامل مع البيانات. يُعتبر Active Record تجسيدًا حقيقيًا لنمط التصميم المعروف باسم Active Record Pattern الذي اقترحه Martin Fowler.
يتناول هذا المقال الموسع مختلف الأساسيات التي تقوم عليها مكتبة Active Record، بدءًا من التسمية، مرورًا بآليات القراءة والكتابة، ووصولًا إلى الجوانب المتعلقة بالتوثيق والاستدعاء والتهجير (Migration). الغرض من المقال تقديم محتوى غني، علمي وعملي، موجه للمطورين والباحثين في مجال تطوير البرمجيات باستخدام Ruby on Rails.
التسمية (Naming Conventions)
يعتمد Active Record على قواعد صارمة وواضحة للتسمية، مما يجعله قادراً على الاستدلال على أسماء الجداول والأعمدة تلقائيًا دون الحاجة لتعريف صريح.
قواعد التسمية في Active Record
-
اسم الكلاس مفرد والجداول بصيغة الجمع:
-
الكلاس
Userيرتبط تلقائيًا بالجدولusers. -
الكلاس
ArticleCommentيرتبط بالجدولarticle_comments.
-
-
الربط بين الكلاسات عن طريق العلاقات:
-
has_many :articlesتشير إلى أن الكلاس يحتوي على مجموعة مقالات. -
belongs_to :userتفترض وجود عمود باسمuser_id.
-
-
العواميد باستخدام snake_case:
-
العمود
created_atيتم إنشاؤه تلقائيًا لتسجيل وقت الإنشاء. -
العمود
updated_atلتسجيل آخر تعديل.
-
هذه القواعد تسهّل على Active Record استنتاج الروابط والعلاقات بين الكائنات دون الحاجة لتعريف مكرر.
قراءة وكتابة البيانات (CRUD Operations)
تُعتبر العمليات الأساسية لقراءة وكتابة البيانات جوهر التفاعل مع قاعدة البيانات عبر Active Record. ويمكن تقسيمها إلى أربع عمليات أساسية معروفة باسم CRUD:
1. الإنشاء (Create)
يمكن إنشاء كائن جديد وربطه بقاعدة البيانات باستخدام:
أو بطريقة مباشرة:
2. القراءة (Read)
يوفر Active Record واجهات متعددة لاسترجاع البيانات:
-
User.all: لاسترجاع جميع المستخدمين. -
User.find(1): لاسترجاع المستخدم الذي رقمه 1. -
User.where(name: "Ali"): لاسترجاع جميع المستخدمين الذين اسمهم “Ali”. -
User.first,User.last,User.find_by(email: "[email protected]").
3. التحديث (Update)
يمكن تحديث الكائنات باستخدام:
rubyuser = User.find(1)
user.update(name: "Omar")
أو:
rubyuser.name = "Omar"
user.save
4. الحذف (Delete)
-
user.destroy: لحذف كائن من قاعدة البيانات. -
User.destroy(3): حذف المستخدم برقم 3. -
User.delete_all: حذف كل السجلات بدون استدعاء callbacks.
التوثيق (Validation)
واحدة من نقاط القوة في Active Record هي آلية التوثيق الداخلي التي تمنع إدخال بيانات غير صحيحة في قاعدة البيانات.
أنواع التوثيقات الشائعة
| نوع التوثيق | الاستخدام |
|---|---|
validates_presence_of |
التأكد من أن الحقل ليس فارغًا |
validates_uniqueness_of |
التأكد من أن القيمة فريدة |
validates_length_of |
ضبط عدد الأحرف |
validates_format_of |
التحقق من تطابق النمط باستخدام Regex |
validates_numericality_of |
التأكد من أن القيمة عددية |
مثال:
rubyclass User < ApplicationRecord
validates :name, presence: true
validates :email, presence: true, uniqueness: true
end
تُفعل هذه التوثيقات عند حفظ الكائنات، وتمنع العمليات غير المتوافقة مع المعايير المحددة.
الاستدعاء (Callbacks)
الاستدعاءات (Callbacks) هي طرق تُنفذ تلقائيًا قبل أو بعد تنفيذ عمليات معينة على الكائن مثل الحفظ أو الحذف.
أنواع Callbacks
| النوع | التوقيت |
|---|---|
before_validation |
قبل التحقق من صحة البيانات |
after_validation |
بعد التحقق من صحة البيانات |
before_save |
قبل الحفظ سواء للإنشاء أو التحديث |
after_save |
بعد الحفظ |
before_create |
قبل عملية الإنشاء فقط |
after_create |
بعد عملية الإنشاء فقط |
before_update |
قبل عملية التحديث فقط |
after_update |
بعد عملية التحديث فقط |
before_destroy |
قبل عملية الحذف |
after_destroy |
بعد عملية الحذف |
مثال تطبيقي:
rubyclass User < ApplicationRecord
before_save :normalize_name
private
def normalize_name
self.name = name.capitalize
end
end
التهجير (Migration)
التهجير هو آلية لإدارة بنية قاعدة البيانات بشكل تدريجي ومنظم باستخدام ملفات Ruby. تساعد هذه الملفات على إنشاء وتعديل الجداول والعواميد بسهولة.
إنشاء التهجير
يمكن إنشاء ملف تهجير باستخدام:
bashrails generate migration CreateUsers name:string email:string
ينتج عن ذلك ملف يحتوي على تعريف للجدول:
rubyclass CreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps
end
end
end
تنفيذ التهجير
bashrails db:migrate
التراجع عن التهجير
bashrails db:rollback
تحديث التهجير
عند الحاجة لتعديل بنية جدول موجود:
bashrails generate migration AddAgeToUsers age:integer
العلاقات (Associations)
تُعد العلاقات بين الكائنات من أهم الميزات التي يوفرها Active Record، ما يسهم في بناء نموذج بيانات مترابط وواضح.
أنواع العلاقات
| نوع العلاقة | الاستخدام |
|---|---|
belongs_to |
يدل على أن الكائن تابع لكائن آخر |
has_one |
يدل على وجود كائن واحد مرتبط |
has_many |
يدل على وجود عدة كائنات مرتبطة |
has_many :through |
علاقة عبر جدول وسيط |
has_and_belongs_to_many |
علاقة متعدد إلى متعدد بدون جدول وسيط |
مثال:
rubyclass Article < ApplicationRecord
belongs_to :user
has_many :comments
end
class User < ApplicationRecord
has_many :articles
end
الجدول التوضيحي لمقارنة بين طرق التهجير والتعديل
| العملية | الأمر المستخدم | الوصف |
|---|---|---|
| إنشاء جدول | rails generate migration CreateTableName |
يُستخدم لإنشاء جداول جديدة |
| إضافة عمود | rails generate migration AddColumnToTable |
يُستخدم لإضافة عمود لجدول موجود |
| تعديل نوع عمود | تعديل يدوي داخل ملف التهجير | لتغيير نوع البيانات في عمود معين |
| حذف عمود | remove_column :table, :column |
لحذف عمود معين |
| تنفيذ التهجير | rails db:migrate |
لتطبيق التهجير |
| التراجع عن آخر تهجير | rails db:rollback |
للتراجع خطوة واحدة في التهجير |
الخلاصة التقنية
يشكّل Active Record العمود الفقري لربط قواعد البيانات بنظام Ruby on Rails بطريقة ديناميكية وواضحة، تسمح للمطورين بالتعامل مع البيانات كما لو كانت كائنات مبرمجة برمجيًا. القوة الحقيقية لـ Active Record لا تكمن فقط في سهولة تنفيذ العمليات الأساسية (CRUD)، بل أيضًا في قدرته على تنظيم العلاقة بين الكائنات، وتقديم آليات مرنة للتحقق من صحة البيانات، والاستجابة للأحداث من خلال callbacks، وتسهيل إدارة البنية التحتية لقاعدة البيانات عبر Migrations.
بفضل هذه الأدوات، يصبح بإمكان فرق التطوير بناء تطبيقات معقدة بسرعة وكفاءة، مع تقليل الحاجة إلى كتابة استعلامات SQL يدويًا، مما يعزز من أمان التطبيق وسلامة البيانات.
المصادر
-
Ruby on Rails Guides: Active Record Basics – https://guides.rubyonrails.org/active_record_basics.html
-
Martin Fowler, Patterns of Enterprise Application Architecture, Addison-Wesley, 2003.

